package com.lwj.designpattern.creativemode.singletonmode;

/**
 * 懒汉模式：
 * 作用：
 * 作用的原理： 不再简单粗暴的去进行对象的实例化，而是根据需要，只有当第一次调用的时候，才会创建出该实例
 */
public class HungryMode {
    private  static  HungryMode hungryMode;

    public HungryMode() {
    }
// 该方式是有线程安全的问题的
    public   static   HungryMode getInstance(){

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

//  并发状态下 此时 引用值为null   两个并发的线程引用都会 new新的对象出来
        if(hungryMode == null){//可能线程1 刚刚执行完if语句 时间片结束 线程2开始执行

            hungryMode = new HungryMode();// 线程2 一直执行完该语句 并进行了return 然后线程1 获取到时间片也来执行该语句 ，这就实例化了两个对象
        }
        return   hungryMode;
    }
//    升级版
    public static  synchronized  HungryMode getInstanceBySynchronized(){
        if(hungryMode == null){
            hungryMode = new HungryMode();
        }
        return   hungryMode;

    }
//     再升级版 --- 该方式还是存在线程安全的问题
}
